package framework.core.dao;

import java.util.List;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.stereotype.Repository;

import framework.core.entity.BaseEntity;

/**
 * @ClassName: IBaseDao 
 * @Description: 基础数据库操作接口 
 * @author: Ching Wang
 * @date 2013-5-18 下午12:22:56 
 * 
 * @param <T>实体
 */
@Repository("baseDao")
public interface IBaseDao<T extends BaseEntity> {

	/**
	 * @Title: save 
	 * @Description: 保存实体对象
	 * @param entity 实体对象
	 * @throws Exception
	 */
	public abstract void save(T entity) throws Exception;

	/**
	 * @Title: update 
	 * @Description: 更新实体对象
	 * @param entity 实体对象
	 * @throws Exception
	 */
	public abstract void update(T entity) throws Exception;

	/**
	 * @Title: delete 
	 * @Description: 删除实体对象
	 * @param entity 实体对象
	 * @return
	 * @throws Exception
	 */
	public abstract boolean delete(T entity) throws Exception;

	/**
	 * @Title: findAll 
	 * @Description: 查询所有数据实体对象
	 * @param c 类（如：SysUser.class）
	 * @return List<T> 实体对象列表
	 * @throws Exception
	 */
	public abstract List<T> findAll(Class<T> c) throws Exception;

	/**
	 * @Title: findAll 
	 * @Description: 分页查找全部
	 * @param c 类
	 * @param firstResult 从第firstResult条数据开始
	 * @param maxResults 取出maxResults条数据
	 * @return List<T> 实体对象列表
	 * @throws Exception
	 */
	public abstract List<T> findAll(Class<T> c, final int firstResult, final int maxResults) throws Exception;

	/**
	 * @Title: findById 
	 * @Description: 查询特定编号的数据
	 * @param c 类
	 * @param id 实体对象编号
	 * @return T 实体对象
	 * @throws Exception
	 */
	public abstract T findById(Class<T> c, String id) throws Exception;

	/**
	 * @Title: findByCriteria 
	 * @Description: 查询特定条件的数据 
	 * @param detachedCriteria 查询条件集合
	 * @return List<T> 实体对象列表
	 * @throws Exception
	 */
	public abstract List<T> findByCriteria(DetachedCriteria detachedCriteria) throws Exception;

	/**
	 * @Title: findByCriteria 
	 * @Description: 分页查询特定条件的数据 
	 * @param detachedCriteria 查询条件集合
	 * @param firstResult 从第firstResult条数据开始
	 * @param maxResults 取出maxResults条数据
	 * @return
	 * @throws Exception
	 */
	public abstract List<T> findByCriteria(DetachedCriteria detachedCriteria, int firstResult, int maxResults) throws Exception;

	/**
	 * @Title: getCount 
	 * @Description: 获取特定条件记录总数量
	 * @param detachedCriteria 查询条件集合
	 * @return long 记录数
	 * @throws Exception
	 */
	public abstract long getCount(DetachedCriteria detachedCriteria) throws Exception;
	
	/**
	 * @Title: find 
	 * @Description: 通过Hql查询数据
	 * @param hql 查询语句
	 * @return List<T> 实体对象列表
	 * @throws Exception
	 */
	public abstract List<T> find(String hql) throws Exception;
	
	/**
	 * @Title: find 
	 * @Description: 通过Hql查询数据
	 * @param hql 查询语句
	 * @param params Map参数集合
	 * @return List<T> 实体对象列表
	 * @throws Exception
	 */
	public abstract List<T> find(String hql, Map<String, Object> params) throws Exception;
	
	/**
	 * @Title: findBySql 
	 * @Description: 通过hql
	 * @param hql "from Users where name=? and password=?"
	 * @param values 参数集合
	 * @return List<Map<String, Object>> Map集合
	 * @throws Exception
	 */
	public abstract List<Map<String, Object>> findBySql(String hql, Object[] values) throws Exception;

	/**
	 * @Title: executeHql 
	 * @Description: 执行查询语句
	 * @param hql 查询语句
	 * @return int
	 * @throws Exception
	 */
	public abstract int executeHql(String hql) throws Exception;
	
	/**
	 * @Title: executeHql 
	 * @Description: 通过查询语句查询数据
	 * @param hql "from Users where name=:name and password=:password"
	 * @param values Map类型的参数集合
	 * @return int
	 * @throws Exception
	 */
	public abstract int executeHql(String hql, Map<String, ?> values) throws Exception;
}
